package ar.pegasus.clasificador.gui;

import java.io.File;
import java.util.List;

import org.jconfig.Configuration;
import org.jconfig.ConfigurationManager;
import org.jconfig.handler.XMLFileHandler;

import ar.pegasus.clasificador.boss.BossAplicacionClasificador;
import ar.pegasus.clasificador.util.AppEtiquetasBotones;
import ar.pegasus.framework.componentes.PException;
import ar.pegasus.framework.engine.business.BossModuloRemote;
import ar.pegasus.framework.entidades.core.Modulo;
import ar.pegasus.framework.templates.config.IConfigClienteManager;
import ar.pegasus.framework.util.BeanFactoryGeneralRemote;
import ar.pegasus.framework.util.FileUtil;

public class ClasificadorConfigClienteManager implements IConfigClienteManager{

	private static ClasificadorConfigClienteManager instance;
	private ConfigurationManager manager;
	private Configuration config;
	private File configFile;


	private ClasificadorConfigClienteManager() {
		this.manager = ConfigurationManager.getInstance();
		this.configFile = new File(getDirectorioPorDefecto() + File.separatorChar + AppEtiquetasBotones.ARCHIVO_CONFIG_CLIENTE_XML);
	}

	public static ClasificadorConfigClienteManager getInstance() {
		if(instance == null) {
			instance = new ClasificadorConfigClienteManager();
		}
		return instance;
	}

	public void cargarConfiguracionCliente() throws PException {
		XMLFileHandler handler = new XMLFileHandler();
		if(configFile.exists() && configFile.canRead()) {
			handler.setFile(configFile);
			try {
				manager.load(handler, AppEtiquetasBotones.NOMBRE_CONFIG);
				if(getConfig().getProperty("idImpresoraNormal", null, "impresoras") != null)
					System.setProperty("idImpresoraNormal", getConfig().getProperty("idImpresoraNormal", null, "impresoras"));
				else
					System.setProperty("idImpresoraNormal", "-1");
				if(getConfig().getProperty("idImpresoraPapeleta", null, "impresoras") != null)
					System.setProperty("idImpresoraPapeleta", getConfig().getProperty("idImpresoraPapeleta", null, "impresoras"));
				else
					System.setProperty("idImpresoraPapeleta", "-1");
				if(getConfig().getProperty("verPreviewImpresion", null, "impresoras") != null)
					System.setProperty("verPreviewImpresion", getConfig().getProperty("verPreviewImpresion", null, "impresoras"));
				else
					System.setProperty("verPreviewImpresion", "false");
				if(getConfig().getProperty("NombreImpresoraNormal", null, "impresoras") != null)
					System.setProperty("NombreImpresoraNormal", getConfig().getProperty("NombreImpresoraNormal", null, "impresoras"));
				else
					System.setProperty("NombreImpresoraNormal", "No Asignada");
				if(getConfig().getProperty("NombreImpresoraPapeleta", null, "impresoras") != null)
					System.setProperty("NombreImpresoraPapeleta", getConfig().getProperty("NombreImpresoraPapeleta", null, "impresoras"));
				else
					System.setProperty("NombreImpresoraPapeleta", "No Asignada");
				if(getConfig().getProperty("idImpresoraFactura", null, "impresoras") != null)
					System.setProperty("idImpresoraFactura", getConfig().getProperty("idImpresoraFactura", null, "impresoras"));
				else
					System.setProperty("idImpresoraFactura", "-1");				
				if(getConfig().getProperty("NombreImpresoraFactura", null, "impresoras") != null)
					System.setProperty("NombreImpresoraFactura", getConfig().getProperty("NombreImpresoraFactura", null, "impresoras"));
				else
					System.setProperty("NombreImpresoraFactura", "No Asignada");
				if(getConfig().getProperty("ImpresoraMatrizPuntoFactura", null, "impresoras") != null)
					System.setProperty("ImpresoraMatrizPuntoFactura", getConfig().getProperty("ImpresoraMatrizPuntoFactura", null, "impresoras"));
				else
					System.setProperty("ImpresoraMatrizPuntoFactura", Boolean.toString(false));
				if(getConfig().getProperty("alarmaIncidente", null, "alarmas") != null)
					System.setProperty("alarmaIncidente", getConfig().getProperty("alarmaIncidente", null, "alarmas"));
				if(getConfig().getProperty("alarmaResolucion", null, "alarmas") != null)
					System.setProperty("alarmaResolucion", getConfig().getProperty("alarmaResolucion", null, "alarmas"));
				if(getConfig().getProperty("alarmaPedidoModificacionMaterial", null, "alarmas") != null)
					System.setProperty("alarmaPedidoModificacionMaterial", getConfig().getProperty("alarmaPedidoModificacionMaterial", null, "alarmas"));
				if(getConfig().getProperty("tamanioFuente") != null)
					System.setProperty("tamanioFuente", getConfig().getProperty("tamanioFuente"));
				if(getConfig().getProperty("usuario") != null)
					System.setProperty("usuario", getConfig().getProperty("usuario"));
				if(getConfig().getProperty("verTip") != null)
					System.setProperty("verTip", getConfig().getProperty("verTip"));
				if(getConfig().getProperty("alarmaNuevoAviso", null, "alarmas") != null)
					System.setProperty("alarmaNuevoAviso", getConfig().getProperty("alarmaNuevoAviso", null, "alarmas"));
				if(getConfig().getProperty("intercalarColoresFilas", null, "exportacionAExcel") != null) {
					System.setProperty("intercalarColoresFilas", getConfig().getProperty("intercalarColoresFilas", null, "exportacionAExcel"));					
				} else {
					System.setProperty("intercalarColoresFilas", "true");					
				}
				if(getConfig().getProperty("pathDefaultExportacionLayout") != null) {
					System.setProperty("pathDefaultExportacionLayout", getConfig().getProperty("pathDefaultExportacionLayout"));
				}
				cargarConfiguracionColumnas();
			} catch(Exception e) {
				throw new PException(AppEtiquetasBotones.ERROR_SAVE_CONFIG, e);
			}
		}
	}

	public void guardarConfiguracionCliente() throws PException {
		XMLFileHandler handler = new XMLFileHandler();
		handler.setFile(configFile);
		try {
			if(System.getProperty("idImpresoraNormal") != null)
				getConfig().setProperty("idImpresoraNormal", System.getProperty("idImpresoraNormal"), "impresoras");
			else
				getConfig().setProperty("idImpresoraNormal", "-1", "impresoras");
			if(System.getProperty("idImpresoraPapeleta") != null)
				getConfig().setProperty("idImpresoraPapeleta", System.getProperty("idImpresoraPapeleta"), "impresoras");
			else
				getConfig().setProperty("idImpresoraPapeleta", "-1", "impresoras");
			if(System.getProperty("verPreviewImpresion") != null)
				getConfig().setProperty("verPreviewImpresion", System.getProperty("verPreviewImpresion"), "impresoras");
			else
				getConfig().setProperty("verPreviewImpresion", "false", "impresoras");
			if(System.getProperty("NombreImpresoraNormal") != null)
				getConfig().setProperty("NombreImpresoraNormal", System.getProperty("NombreImpresoraNormal"), "impresoras");
			else
				getConfig().setProperty("NombreImpresoraNormal", "No Asignada", "impresoras");
			if(System.getProperty("NombreImpresoraPapeleta") != null)
				getConfig().setProperty("NombreImpresoraPapeleta", System.getProperty("NombreImpresoraPapeleta"), "impresoras");
			else
				getConfig().setProperty("NombreImpresoraPapeleta", "No Asignada", "impresoras");
			if(System.getProperty("NombreImpresoraPapeleta") != null)
				getConfig().setProperty("NombreImpresoraPapeleta", System.getProperty("NombreImpresoraPapeleta"), "impresoras");
			else
				getConfig().setProperty("NombreImpresoraPapeleta", "No Asignada", "impresoras");
			if(System.getProperty("idImpresoraFactura") != null)
				getConfig().setProperty("idImpresoraFactura", System.getProperty("idImpresoraFactura"), "impresoras");
			if(System.getProperty("NombreImpresoraFactura") != null)
				getConfig().setProperty("NombreImpresoraFactura", System.getProperty("NombreImpresoraFactura"), "impresoras");
			if(System.getProperty("ImpresoraMatrizPuntoFactura") != null)
				getConfig().setProperty("ImpresoraMatrizPuntoFactura", System.getProperty("ImpresoraMatrizPuntoFactura"), "impresoras");
			if(System.getProperty("alarmaIncidente") != null)
				getConfig().setProperty("alarmaIncidente", System.getProperty("alarmaIncidente"), "alarmas");
			if(System.getProperty("alarmaResolucion") != null)
				getConfig().setProperty("alarmaResolucion", System.getProperty("alarmaResolucion"), "alarmas");
			if(System.getProperty("alarmaPedidoModificacionMaterial") != null)
				getConfig().setProperty("alarmaPedidoModificacionMaterial", System.getProperty("alarmaPedidoModificacionMaterial"), "alarmas");
			if(System.getProperty("tamanioFuente") != null)
				getConfig().setProperty("tamanioFuente", System.getProperty("tamanioFuente"));
			if(System.getProperty("usuario") != null)
				getConfig().setProperty("usuario", System.getProperty("usuario"));
			if(System.getProperty("verTip") != null)
				getConfig().setProperty("verTip", System.getProperty("verTip"));
			guardarConfiguracionColumnas();
			if(System.getProperty("alarmaNuevoAviso") != null) {
				getConfig().setProperty("alarmaNuevoAviso", System.getProperty("alarmaNuevoAviso"), "alarmas");
			}
			if(System.getProperty("intercalarColoresFilas") != null) {
				getConfig().setProperty("intercalarColoresFilas", System.getProperty("intercalarColoresFilas"), "exportacionAExcel");
			} else {
				getConfig().setProperty("intercalarColoresFilas", System.getProperty("false"), "exportacionAExcel");
			}
			if(System.getProperty("pathDefaultExportacionLayout") != null) {
				getConfig().setProperty("pathDefaultExportacionLayout", System.getProperty("pathDefaultExportacionLayout"));
			}
			if(System.getProperty("skinDefault") != null) {
				getConfig().setProperty("skinDefault", System.getProperty("skinDefault"));
			}
			manager.save(handler, getConfig());
		} catch(Exception e) {
			throw new PException(AppEtiquetasBotones.ERROR_SAVE_CONFIG, e);
		}
	}

	public String cargarConfiguracionSkin() throws PException {
		XMLFileHandler handler = new XMLFileHandler();
		String skinDefault = null;
		if(configFile.exists() && configFile.canRead()) {
			handler.setFile(configFile);
			try {
				manager.load(handler, AppEtiquetasBotones.NOMBRE_CONFIG);
				skinDefault = getConfig().getProperty("skinDefault");
			} catch(Exception e) {
				throw new PException(AppEtiquetasBotones.ERROR_SAVE_CONFIG, e);
			}
		}
		return skinDefault;
	}

	private void cargarConfiguracionColumnas() throws PException {
		List<Modulo> modulos ;
		BossModuloRemote bossModulo = BeanFactoryGeneralRemote.getInstance().getBean(BossModuloRemote.class);
		modulos = bossModulo.getModulosPorAplicacion(BossAplicacionClasificador.getInstance().getAplicacion().getIdAplicacion()) ;

		for(Modulo modulo : modulos) {
			Integer id = modulo.getIdModulo(); 
			String spKeyOrdenColumnas = "Columnas_Modulo_ID_" + id;
			String categoryName = "columnas";
			if(getConfig().getProperty(spKeyOrdenColumnas, null, categoryName) != null) {
				System.setProperty(spKeyOrdenColumnas, getConfig().getProperty(spKeyOrdenColumnas, null, categoryName));
			}
			String spKeyColumnasOcultas = "Columnas_ocultas_Modulo_ID_" + id;
			if(getConfig().getProperty(spKeyColumnasOcultas, null, categoryName) != null) {
				System.setProperty(spKeyColumnasOcultas, getConfig().getProperty(spKeyColumnasOcultas, null, categoryName));
			}
		}
	}

	private void guardarConfiguracionColumnas() throws PException {
		List<Modulo> modulos ;
			BossModuloRemote bossModulo = BeanFactoryGeneralRemote.getInstance().getBean(BossModuloRemote.class);
			modulos = bossModulo.getModulosPorAplicacion(BossAplicacionClasificador.getInstance().getAplicacion().getIdAplicacion()) ;
		for(Modulo modulo : modulos) {
			Integer id = modulo.getIdModulo(); 
			String spKeyOrdenColumnas = "Columnas_Modulo_ID_" + id;
			String categoryName = "columnas";
			if(System.getProperty(spKeyOrdenColumnas) != null) {
				getConfig().setProperty(spKeyOrdenColumnas, System.getProperty(spKeyOrdenColumnas), categoryName);
			}
			String spKeyColumnasOcultas = "Columnas_ocultas_Modulo_ID_" + id;
			if(System.getProperty(spKeyColumnasOcultas) != null) {
				getConfig().setProperty(spKeyColumnasOcultas, System.getProperty(spKeyColumnasOcultas), categoryName);
			}
		}
	}

	private Configuration getConfig() {
		if(config == null) {
			config = ConfigurationManager.getConfiguration(AppEtiquetasBotones.NOMBRE_CONFIG);
			config.setEncoding(AppEtiquetasBotones.ENCODING);
		}
		return config;
	}

	private String getDirectorioPorDefecto() {
		return FileUtil.getDirectorioPorDefecto().getAbsolutePath();
	}

}
